// 栈 Stack
export default class Stack {
    #stack = []
    #top = -1

    /**
     * 测试堆栈是否为空
     * @return {boolean}
     */
    empty () {
        return this.#top === -1
    }

    /**
     * 把项压入堆栈顶部
     * @param value {object}
     */
    push (value) {
        this.#top++
        this.#stack[this.#top] = value
    }

    /**
     * 移除堆栈顶部的对象，并作为此函数的值返回该对象
     * @return {object}
     */
    pop () {
        if (this.empty()) {
            throw new Error('EmptyStackException')
        }
        let value = this.#stack[this.#top]
        this.#top--
        return value
    }

    /**
     * 查看堆栈顶部的对象，但不从堆栈中移除它
     * @return {object}
     */
    peek () {
        if (this.empty()) {
            throw new Error('EmptyStackException')
        }
        return this.#stack[this.#top]
    }

    /**
     *  返回堆栈的组件数
     * @return {number}
     */
    size () {
        if (this.empty()) {
            return 0
        }
        return this.#top + 1
    }

    /**
     * 返回对象在堆栈中的位置，以 1 为基数 如果不包含该元素，则返回 -1
     * @param value {object}
     * @return {number}
     */
    search (value) {
        if (this.empty()) {
            throw new Error('EmptyStackException')
        }
        let index = -1
        for (let i = this.#top; i >= 0; i--) {
            console.log(this.#stack[i])
            if (this.#stack[i] === value) {
                index = this.#top - i + 1
                break
            }
        }
        return index
    }

    toString () {
        return this.#stack.slice(0, this.#top).toString()
    }
}
